/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Tabla;

import Tabla.DescTipo.tipo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

/**
 *
 * @author Alex
 */
public class TablaSimbolos {
   
    ArrayList<EntradaTabla> entradas;
    //ESTRUCTURA PARA ALMACENAR LOS TIPOS PENDIENTES
    private HashMap<String,ArrayList<String>> tiposPendientes;
 
 public TablaSimbolos(){
     entradas=new ArrayList<EntradaTabla>();
     tiposPendientes=new HashMap<String,ArrayList<String>>();
     
 }

 public boolean estaID(String ID){
      EntradaTabla ent;
      Iterator<EntradaTabla> iter = entradas.iterator();
	    while (iter.hasNext()) {
	    	ent = iter.next();
	        if (ent.getId().equals(ID)) return true;

	    }
      return false;
    }

 public EntradaTabla dameEntradaTabla(String id){
     EntradaTabla ent;
		Iterator<EntradaTabla> iter = entradas.iterator();
		while (iter.hasNext()) {
			ent = iter.next();
			if (ent.getId().equals(id)) {
				return ent;
			}
		}
		return null;
 }

 public DescTipo esTipoDeclarado(String tipoApuntado,String tipoPropio){

          if (estaID(tipoApuntado)) return dameEntradaTabla(tipoApuntado).getDesc();
          else if (tipoApuntado.equals("ENT")) return new TipoBasico(tipo.ENT,"");
              else if (tipoApuntado.equals("REAL")) return new TipoBasico(tipo.REAL,"");
                else{
                  añadeTipoPendiente(tipoApuntado,tipoPropio);
                  return null;
                }

 }

 public void añadeTipoPendiente(String tipoPendiente,String tipoPropio){
          ArrayList<String> pendientes=tiposPendientes.get(tipoPendiente);
          if (pendientes==null){
              pendientes=new ArrayList<String>();
              pendientes.add(tipoPropio);
              tiposPendientes.put(tipoPendiente,pendientes);
          }
          else{
              pendientes.add(tipoPropio);
            
          }
 }

 public void resuelveTipoPendiente(String tipoPendiente,DescTipo des){
          ArrayList<String> tiposPend=tiposPendientes.get(tipoPendiente);
          Iterator it=tiposPend.iterator();
          int i=0;
          while (i<tiposPend.size()){
              String s=(String)tiposPend.get(i);
              EntradaTabla e=this.dameEntradaTabla(s);
              TipoPuntero tp=new TipoPuntero(tipoPendiente,des,e.getId());
              e.setDesc(tp);
              tiposPend.remove(s);
              i++;

         }
          tiposPendientes.remove(tipoPendiente);
 }



public boolean setIdentificador(EntradaTabla entrada){
    if (!estaID(entrada.getId())){
        if (tiposPendientes.containsKey(entrada.getId())){
            entradas.add(entrada);
            resuelveTipoPendiente(entrada.getId(),entrada.getDesc());
            return true;
        }else  entradas.add(entrada);
        return true;
    }
    else return false;
}

public int getDir(String id){
    Iterator it=entradas.iterator();
    int i=0;
    while (it.hasNext()){
        EntradaTabla e=(EntradaTabla)it.next();
        if(e.getId().equals(id)) return i;
        else i++;
    }
    return -1;
}

public tipo getTipo(String ID){
    Iterator it=entradas.iterator();
    while (it.hasNext()){
        EntradaTabla e=(EntradaTabla)it.next();
        if(e.getId().equals(ID)){
            return e.getDesc().t;

        }

    }
    return tipo.TERR;
}

public String dameNombreTipo(String Id){
     Iterator it=entradas.iterator();
    while (it.hasNext()){
        EntradaTabla e=(EntradaTabla)it.next();
        if(e.getId().equals(Id)){
            return e.getDesc().getNombre();

        }

    }
    return "";
}

public ArrayList<EntradaTabla> getVariables(){
    return entradas;
}
public String getClase(String Id){
    return dameEntradaTabla(Id).getClase().toString();
}
public boolean hayTiposPendientes(){
    return !tiposPendientes.isEmpty();
}

}
